<?php
/**
 * Atividade Active Record
 * @author  <your-name-here>
 */
class Atividade extends TRecord
{
    const TABLENAME = 'atividade';
    const PRIMARYKEY= 'id_atividade';
    const IDPOLICY =  'serial'; // {max, serial}
    
    
    private $cliente;
    private $dificuldade;
    private $prioridade;
    private $projeto;
    private $situacao;
    private $tipo;
    private $atendimentos;

    /**
     * Constructor method
     */
    public function __construct($id = NULL, $callObjectLoad = TRUE)
    {
        parent::__construct($id, $callObjectLoad);
        parent::addAttribute('id_projeto');
        parent::addAttribute('id_situacao');
        parent::addAttribute('id_prioridade');
        parent::addAttribute('id_tipo');
        parent::addAttribute('id_cliente');
        parent::addAttribute('id_solicitante');
        parent::addAttribute('id_destinatario');
        parent::addAttribute('titulo');
        parent::addAttribute('descricao');
        parent::addAttribute('dt_inicial');
        parent::addAttribute('dt_final');
        parent::addAttribute('tempo_estimado');
    }

    
    /**
     * Method set_cliente
     * Sample of usage: $atividade->cliente = $object;
     * @param $object Instance of Cliente
     */
    public function set_cliente(Cliente $object)
    {
        $this->cliente = $object;
        $this->cliente_id = $object->id;
    }
    
    /**
     * Method get_cliente
     * Sample of usage: $atividade->cliente->attribute;
     * @returns Cliente instance
     */
    public function get_cliente()
    {
        // loads the associated object
        if (empty($this->cliente))
            $this->cliente = new Cliente($this->cliente_id);
    
        // returns the associated object
        return $this->cliente;
    }
    
    
    /**
     * Method set_dificuldade
     * Sample of usage: $atividade->dificuldade = $object;
     * @param $object Instance of Dificuldade
     */
    public function set_dificuldade(Dificuldade $object)
    {
        $this->dificuldade = $object;
        $this->dificuldade_id = $object->id;
    }
    
    /**
     * Method get_dificuldade
     * Sample of usage: $atividade->dificuldade->attribute;
     * @returns Dificuldade instance
     */
    public function get_dificuldade()
    {
        // loads the associated object
        if (empty($this->dificuldade))
            $this->dificuldade = new Dificuldade($this->dificuldade_id);
    
        // returns the associated object
        return $this->dificuldade;
    }
    
    
    /**
     * Method set_prioridade
     * Sample of usage: $atividade->prioridade = $object;
     * @param $object Instance of Prioridade
     */
    public function set_prioridade(Prioridade $object)
    {
        $this->prioridade = $object;
        $this->prioridade_id = $object->id;
    }
    
    /**
     * Method get_prioridade
     * Sample of usage: $atividade->prioridade->attribute;
     * @returns Prioridade instance
     */
    public function get_prioridade()
    {
        // loads the associated object
        if (empty($this->prioridade))
            $this->prioridade = new Prioridade($this->prioridade_id);
    
        // returns the associated object
        return $this->prioridade;
    }
    
    
    /**
     * Method set_projeto
     * Sample of usage: $atividade->projeto = $object;
     * @param $object Instance of Projeto
     */
    public function set_projeto(Projeto $object)
    {
        $this->projeto = $object;
        $this->projeto_id = $object->id;
    }
    
    /**
     * Method get_projeto
     * Sample of usage: $atividade->projeto->attribute;
     * @returns Projeto instance
     */
    public function get_projeto()
    {
        // loads the associated object
        if (empty($this->projeto))
            $this->projeto = new Projeto($this->projeto_id);
    
        // returns the associated object
        return $this->projeto;
    }
    
    
    /**
     * Method set_situacao
     * Sample of usage: $atividade->situacao = $object;
     * @param $object Instance of Situacao
     */
    public function set_situacao(Situacao $object)
    {
        $this->situacao = $object;
        $this->situacao_id = $object->id;
    }
    
    /**
     * Method get_situacao
     * Sample of usage: $atividade->situacao->attribute;
     * @returns Situacao instance
     */
    public function get_situacao()
    {
        // loads the associated object
        if (empty($this->situacao))
            $this->situacao = new Situacao($this->situacao_id);
    
        // returns the associated object
        return $this->situacao;
    }
    
    
    /**
     * Method set_tipo
     * Sample of usage: $atividade->tipo = $object;
     * @param $object Instance of Tipo
     */
    public function set_tipo(Tipo $object)
    {
        $this->tipo = $object;
        $this->tipo_id = $object->id;
    }
    
    /**
     * Method get_tipo
     * Sample of usage: $atividade->tipo->attribute;
     * @returns Tipo instance
     */
    public function get_tipo()
    {
        // loads the associated object
        if (empty($this->tipo))
            $this->tipo = new Tipo($this->tipo_id);
    
        // returns the associated object
        return $this->tipo;
    }
    
    
    /**
     * Method addAtendimento
     * Add a Atendimento to the Atividade
     * @param $object Instance of Atendimento
     */
    public function addAtendimento(Atendimento $object)
    {
        $this->atendimentos[] = $object;
    }
    
    /**
     * Method getAtendimentos
     * Return the Atividade' Atendimento's
     * @return Collection of Atendimento
     */
    public function getAtendimentos()
    {
        return $this->atendimentos;
    }

    /**
     * Reset aggregates
     */
    public function clearParts()
    {
        $this->atendimentos = array();
    }

    /**
     * Load the object and its aggregates
     * @param $id object ID
     */
    public function load($id)
    {
    
        // load the related Atendimento objects
        $repository = new TRepository('Atendimento');
        $criteria = new TCriteria;
        $criteria->add(new TFilter('id_atividade', '=', $id));
        $this->atendimentos = $repository->load($criteria);
    
        // load the object itself
        return parent::load($id);
    }

    /**
     * Store the object and its aggregates
     */
    public function store()
    {
        // store the object itself
        parent::store();
    
        // delete the related Atendimento objects
        $criteria = new TCriteria;
        $criteria->add(new TFilter('id_atividade', '=', $this->id_atividade));
        $repository = new TRepository('Atendimento');
        $repository->delete($criteria);
        // store the related Atendimento objects
        if ($this->atendimentos)
        {
            foreach ($this->atendimentos as $atendimento)
            {
                unset($atendimento->id);
                $atendimento->id_atividade = $this->id_atividade;
                $atendimento->store();
            }
        }
    }

    /**
     * Delete the object and its aggregates
     * @param $id object ID
     */
    public function delete($id = NULL)
    {
        $id = isset($id) ? $id : $this->id;
        // delete the related Atendimento objects
        $repository = new TRepository('Atendimento');
        $criteria = new TCriteria;
        $criteria->add(new TFilter('id_atividade', '=', $id));
        $repository->delete($criteria);
        
    
        // delete the object itself
        parent::delete($id);
    }


}
